package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.mapper.EmpExprMpper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMpper empExprMpper;

    @Override
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {
        // 开启分页
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
        //紧跟着的第一个select方法会分页，调用 Mapper 的 list 方法（查询全部）
        Page<Emp> pageInfo = empMapper.list(empQueryParam);
        //分页时，实际返回的结果list类型是Page<E>，如果想取出分页信息，需要强制转换为Page<E>
        log.info("查询结果：{}", pageInfo);
        //getTotal()获取总记录数
        //getResult()获取分页结果
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getResult());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    //事务失效的场景：
    //rollbackFor属性指定回滚的异常，默认是RuntimeException，如果是Exception，则事务失效，rollbackFor=Exception.class，只要出异常事务就回滚
    //在方法进入前进行try-catch处理，先执行begin,如果没报错则提交事务，报错就回滚事务
    //如果使用@Transactional注解，则不需要try-catch处理，不要捕获异常，外部就无法捕获异常，外部认为内部没问题，没问题就提交事务.
    public void add(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(emp.getCreateTime());
        empMapper.insert(emp);
        //除零
//        int i = 10 / 0;
        Integer newId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(e -> e.setEmpId(newId));
            empExprMpper.insertBatch(exprList);
        }
    }

    @Override
    @Transactional
    public void deleteByIds(List<Integer> ids) {
        empMapper.deleteByIds(ids);
        empExprMpper.deleteByEmpsIds(ids);
    }
    @Override
    public Emp getById(Integer id) {
        //获取员工信息
        Emp emp = empMapper.selectById(id);
        //员工工作经历
        List<EmpExpr> exprList = empExprMpper.selectByEmpId(id);
        emp.setExprList(exprList);
        return emp;
    }
    @Override
    public Emp getInfoById(Integer id) {

        return empMapper.getInfoById(id);
    }
    @Override
    @Transactional
    public void update(Emp emp) {
        empMapper.updateById(emp);
        emp.setUpdateTime(LocalDateTime.now());
        empExprMpper.deleteByEmpsIds(Arrays.asList(emp.getId()));
        Integer empId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(e -> e.setEmpId(empId));
            empExprMpper.insertBatch(exprList);
        }

    }
    /***
     *
     * 登录校验
     */

    @Override
    public LoginInfo login(Emp emp) {
        Emp empDB = empMapper.getInfoByUsernameAndPassword(emp);
        if(null!=empDB)
        {
            HashMap<String, Object> claims = new HashMap<>();
            claims.put("id", empDB.getId());
            claims.put("name", empDB.getName());
            String token= JwtUtils.generateJwt(claims);
            return new LoginInfo(empDB.getId(),empDB.getUsername(),empDB.getName(),token);
        }
        return null;
    }


}
